package ar.uba.fi.tecnicas.juego;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import ar.uba.fi.tecnicas.fabrica.MateriaPrima;
import ar.uba.fi.tecnicas.fabrica.TipoMateriaPrima;
import ar.uba.fi.tecnicas.fabrica.TipoProducto;
import ar.uba.fi.tecnicas.fabrica.Transformacion;
import ar.uba.fi.tecnicas.fabrica.exceptions.CantidadIngresadaMenorACeroException;

public class ConfiguracionTipoProducto extends ConfiguracionItems<TipoProducto> 
{
	public final static ConfiguracionTipoProducto instance = new ConfiguracionTipoProducto();
	
	protected ConfiguracionTipoProducto()
	{
		super();
	}

	protected void LoadData()
	{		
		Document xml = ConfiguracionJuego.instancia.obtenerXml();
		
		Element parentElement = this.getChildElement(xml.getDocumentElement(), "TiposProducto");
		NodeList list = parentElement.getElementsByTagName("TipoProducto");
		
		for(int index = 0; index < list.getLength(); index++)
		{
			if(list.item(index).getNodeType() == Node.ELEMENT_NODE)
			{
				Element tipoProductoElement = (Element)list.item(index);

				String nombre = this.getElementValue(this.getChildElement(tipoProductoElement, "Nombre"));
				String precio = this.getElementValue(this.getChildElement(tipoProductoElement, "Precio"));
				String capitalInversion = this.getElementValue(this.getChildElement(tipoProductoElement, "CapitalInversion"));

				TipoProducto tipoProducto = new TipoProducto(
					nombre,
					Double.valueOf(precio),
					Double.valueOf(capitalInversion)
				);
				
				this.cargarTransformaciones(tipoProducto, tipoProductoElement);
				
				this.cargarMateriasPrimas(tipoProducto, tipoProductoElement);
				
				this.items.put(tipoProducto.getNombre(), tipoProducto);
			}
		}
	}

	private void cargarMateriasPrimas(TipoProducto tipoProducto, Element tipoProductoElement) 
	{
		// Cargar materias primas necesarias
		Element materiasPrimasElement = this.getChildElement(tipoProductoElement, "MateriasPrimas");
		NodeList materiasPrimaList = materiasPrimasElement.getElementsByTagName("MateriaPrima");

		for(int j = 0; j < materiasPrimaList.getLength(); j++)
		{
			Element materiaPrimaElement = (Element)materiasPrimaList.item(j);
			
			String nombreTipo = this.getElementValue(this.getChildElement(materiaPrimaElement, "NombreTipo"));
			String cantidad = this.getElementValue(this.getChildElement(materiaPrimaElement, "Cantidad"));
			
			
			try 
			{
				TipoMateriaPrima tipoMateriaPrima = ConfiguracionTipoMateriaPrima.instance.getItem(nombreTipo);
				
				MateriaPrima materiaPrima = new MateriaPrima(tipoMateriaPrima, Double.valueOf(cantidad)); 
				
				tipoProducto.agregarMateriaPrima(materiaPrima);
			} 
			catch (CantidadIngresadaMenorACeroException e) 
			{
				e.printStackTrace();
			}
		}		
	}

	private void cargarTransformaciones(TipoProducto tipoProducto, Element tipoProductoElement)
	{
		// Cargar transformaciones necesarias
		Element transformacionesElement = this.getChildElement(tipoProductoElement, "Transformaciones");
		NodeList transformacionesList = transformacionesElement.getElementsByTagName("Transformacion");

		for(int j = 0; j < transformacionesList.getLength(); j++)
		{
			Element transformacionElement = (Element)transformacionesList.item(j);
			
			String nombreTransformacion = this.getElementValue(transformacionElement);
			
			Transformacion transformacion = ConfiguracionTransformacion.instance.getItem(nombreTransformacion);
			
			if(transformacion != null)
			{
				tipoProducto.agregarTransformacion(transformacion);
			}					
		}
	}
}
